<!DOCTYPE HTML>
<html>
<head>
<title>Boomerang 使用方法 #7: 不正なビーコンを防ぐ</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../boomerang-docs.css">
</head>
<body>
<span style="float:right;"><a href="../">ドキュメント一覧</a> | <a href="index.html">使用方法一覧</a></span>
<h1>Boomerang 使用方法 #7: 不正なビーコンを防ぐ</h1>
<p>
この要件の説明は <a href="../use-cases.html#uc-9">ユースケース #9</a> をご覧ください。
</p>

<p>
防ぐ必要がある不正なビーコンは2種類あります:
</p>
<ol>
<li>サービス妨害（DoS）攻撃</li>
<li>あなたのページから送信されていない偽のビーコン</li>
</ol>

<h2>サービス妨害（DoS）攻撃</h2>
<p>
DoS 攻撃を防ぐために JavaScript にできることは何もありませんが、あなたのサーバーに1つの IP からのビーコンを送る制限する設定はできます。通常ウェブサイトを開けるユーザーよりも速くビーコンを受信するべきではありません。不正なアクセスパターンを見つけるために、システムのオペレーションやウェブサーバーの設定を変えたくなるでしょう。これらの大半はこのドキュメントの範囲を越えていますが、攻撃から守るためのヒントをいくつか紹介します。
</p>

<p>
ほとんどの開発者は boomerang の <code>beacon_url</code> パラメーターを使用するバックエンドのスクリプトをつくると思います。ここで問題になるのはこれらのリクエストはキャッシュされないということです。スクリプトはビーコンのリクエストのたびに実行され、ウェブサーバーやデータベースのリソースを消費します。DoS 攻撃によって、あなたのサーバーをダウンさせることが可能になります。
</p>

<p>
それをコントロールする良い方法としては、ビーコンサーバー上で動作する軽量なウェブサーバーを用意すること、このサーバーをビーコンの URL のリクエストだけに応答するように設定することです。全てのビーコンのリクエストには <code>HTTP 204</code> のレスポンスを返すべきです。これはサーバー内の簡単な設定することで、リクエストごとにディスクの検索をさせる必要がないことを意味します。サーバーはリクエストをアクセスログに書き込みます。ここに全ての QueryString やパラメーター、Cookie を含める必要があります。
</p>

<p>
定期的に - 1時間に1回や1日に1回（ビーコンのボリュームに依存します）、ログをバッチ処理すればそこから実際のビーコンのパラメーターを見つけだせます。明らかに不正なビーコンは破棄します。ビーコンからデータを抽出するための実際のコードは全てのリクエストに対して行うかバッチ処理で行うかに関わらず同じです。ビーコンからのデータの抽出については <a href="howto-0.html">使用方法 #0</a> をご覧ください。
</p>

<p>
オンライン上にある DoS 攻撃とその対策の仕方についての <a href="http://en.wikipedia.org/wiki/Denial-of-service_attack">さらに</a> <a href="http://learn-networking.com/network-security/how-to-prevent-denial-of-service-attacks">多くの</a> <a href="http://www.cert.org/tech_tips/denial_of_service.html">情報</a> も参考にしてください。
</p>

<h2>あなたのページから送信されていない偽のビーコン</h2>
<p>
この場合の最も一般的な理由はあなたのページデザインを気に入った誰かがそれを自身のサーバーにコピーしてしまうことです。boomerang の JavaScript を含み、<code>beacon_url</code> も更新されていないとあなたのサーバーへビーコンが送信され続けます。きっと望まないことでしょう。
</p>

<p>
この問題を解決する最も簡単な方法は全てのリクエストのリファラーをチェックし、あなたのドメインからではないリクエストをブロックすることです。これを知らない不正ユーザーには効果がありますが、悪意のある不正ユーザーには効果がありません。
</p>

<p>
悪意のあるユーザーはあなたのサイトの何かが得られる全ての URL を悪用しようとします。何に使うかは彼らにとって重要ではありません。これらはあなたのビーコンの正しい使用ではありませんし、全てブロックするべきです。最善の対策は <a href="http://en.wikipedia.org/wiki/Cryptographic_nonce">nonce</a> や <a href="http://abhinavsingh.com/blog/2009/10/web-security-using-crumbs-to-protect-your-php-api-ajax-call-from-cross-site-request-forgery-csrfxsrf-and-other-vulnerabilities/">crumb</a> を通すことです。これは1度だけ有効な文字列です。これにはハッシュの一部として現在のタイムスタンプと有効期限が含まれています。これをページのリクエスト毎に生成し、<code>BOOMR.addVar()</code> メソッドを使って boomerang に追加させます。ビーコンサーバー上で、ビーコンを受け取る前に nonce を検証します。もしバッチ処理を行っているなら、nonce を検証するために実行しているバッチ処理の時間ではなくリクエストのタイムスタンプを使うべきです。
</p>

<pre>
BOOMR.addVar("nonce", "125a7b79de989876cce970f0768a07");	<span class="comment">// your nonce will be different</span>
</pre>

<p>
nonce はビーコンの URL を直接叩くものから守れますが、nonce はリクエスト毎に変更されるため、あなたのページはキャッシュできないことを意味します。
</p>

<p>
nonce はあなたのページからビーコンを抜き取るものからは守れません &mdash; 正しい nonce と一緒にその時はビーコンのパラメーターを変更してあなたのサーバーに送信してきます。これを防ぐにはビーコンのパラメーターを登録する必要がありますが、これは JavaScript ではできません。この問題に対する一般的な解決方法は今のところ分かりません。
</p>

<p class="perma-link">
最新のソースコードとドキュメントは <a href="http://github.com/lognormal/boomerang/">github.com/lognormal/boomerang</a> に公開されています。
</p>

<p id="results">
</p>

<script src="../../../boomerang.js" type="text/javascript"></script>
<script src="../../howtos/howtos.js" type="text/javascript"></script>
<script type="text/javascript">
BOOMR.init({
		user_ip: '10.0.0.1',
		BW: {
			base_url: '../../images/',
			cookie: 'HOWTO-BA'
		},
		RT: {
			cookie: 'HOWTO-RT'
		}
	});
</script>
</body>
</html>
